1時間プログラミング 009 はてブで最近ブックマークしたエントリーを表示する
概要
はてブで最近ブックマークしたエントリーを表示する
privateなブックマークは対象外
所要時間: 1時間
使い方
code:terminal
$ deno run --allow-net mod.ts
実装
はてブAPIを使いたかったが、エントリー一覧を取得するようなAPIは存在しない となると、スクレイピングの出番
1ページ目に表示されるブックマークのみを対象とする
privateなブックマークは対象外
今回はTS(Deno)で作成する
ブックマークトップページのHTMLを取得する
code:ts
const fetchHatebuHtml = async (id: string): Promise<string> => {
const url = https://b.hatena.ne.jp/${id}/bookmark;
const resp = await fetch(url);
return resp.text();
};
HTMLをパースしてエントリー一覧を取得する
code:ts
type HatebuEntry = {
url: string;
text: string;
};
const parseHatebuHtml = (html: string): HatebuEntry[] => {
const doc = new DOMParser().parseFromString(html, "text/html")!;
const entryList = Array.from(
doc.querySelectorAll(".bookmark-item"),
) as Element[];
return entryList.map((elm) => {
const titleElem = elm.querySelector(".centerarticle-entry-title a")!;
const url = titleElem.getAttribute("href")!;
const text = titleElem.textContent;
return { url, text };
});
};
querySelectorAll()ではNodeList型が返る(型引数は指定できない)
今回はNodeではなくElementが必要なので、型を強制的に変換している
エントリー一覧を出力する
code:ts
const printHatebuEntryList = (entryList: HatebuEntry[]) => {
entryList.forEach((ent) => {
console.log(${ent.text} / ${ent.url});
});
};
感想
deno-domではquerySelectAll()に型引数を指定できないので、そこで少し手間取った